package priv.wangy.micro.common.po.valid;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import priv.wangy.micro.common.po.valid.validator.ContListValidator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 连续的List集合
 *
 * @author zhangjq
 * @since 2024-03-29
 */
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ContListValidator.class)
public @interface ContList {

    /**
     * 连续的间隔
     */
    int interval() default 1;

    /**
     * 集合是否可为空
     */
    boolean empty() default true;

    /**
     * 用于排序的对象类型
     * 必须继承Comparable接口
     */
    Class<? extends Comparable> sortable() default Integer.class;

    /**
     * 队列头部
     * 只对sortable为 String 或 Number 时生效
     */
    int head() default 0;

    /**
     * 适用于复杂的结构体
     * 用于逐层定位至最终用于排序的对象
     * 包含最外层对象
     * 不包含最终用于排序的对象
     */
    Class<?>[] ctorClazz() default {};

    /**
     * 适用于复杂的结构体
     * 用于逐层定位至最终排序的对象
     * 不包含最外层对象
     * 包含最终用于排序的对象
     */
    String[] ctorField() default {};

    String message() default "非连续的列表";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
